.. _ref_domain-exit:

Удаление первого контроллера домена
===================================

Удаление первого контроллера домена (КД) возможно и при наличии доступа к нему, и если первый контроллер домена недоступен.

Подготовка к удалению
---------------------

.. important::

    Во время переноса (удаления) первого КД следует воздержаться от сторонних операций с контроллерами. Минимизировать запросы к LDAP. В процессе процедуры обновления реплики некоторые возможности будут недоступны.

    Перед удалением первого КД необходимо проверить наличие ``/etc/ssl/freeipa/ca.key`` на всех КД с ролью ``pkiproxy`` и на КД, который предполагается сделать первым.

До начала процедуры удаления первого контроллера домена необходимо произвести следующие действия:

1. Выполнить резервное копирование всех контроллеров домена одним из следующих способов:

    1. создание **снапшотов**,
    2. согласно данной инструкции, при условии, что контроллеры не являются виртуальными машинами.

2. Проверить доступность выделения на ``id_range`` на новом контроллере. Если пользователи не создавались на контроллерах, отличных от первого, то новые ``id_range`` предоставлены не будут. Решением проблемы может стать добавление пользователя на любом КД, отличном от первого. Либо, обращение к **LDAP** и изменение ``ldif``. Выделяемые на контроллере ``id_range`` находятся в **LDAP** по пути: ``cn=Posix IDs,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config``. На новый первый кд можно перенести данные со старого первого КД, используя 2 способа: 
    
    1. ``ldapsearch`` и ``ldapmodify`` 

    .. code-block:: bash
        
        admin@dc-1:~$ ldapsearch -Q -LLL -b "cn=posix ids,cn=distributed numeric assignment plugin,cn=plugins,cn=config" -o ldif-wrap=no > old.ldif
        admin@dc-1:~$ scp old.dif dc-2:/tmp/new.ldif
        admin@dc-1:~$ ssh dc-2
        admin@dc-2:~$ nano /tmp/new.ldif
        ---
        dn: cn=posix ids,cn=distributed numeric assignment plugin,cn=plugins,cn=config
        changetype: modify
        replace: dnaMaxValue
        dnaMaxValue: [значение]
        changetype: modify
        replace: dnaNextValue
        dnaNextValue: [значение]
        ---
        admin@dc-2:~$ ldapmodify /tmp/new.ldif

В выводе не должно быть ошибок - строк со словами ``Invalid``, ``wrong``, ``error`` и т.д.

    .. note:: 

        Показаны примерные данные, которые должны содержаться в файле: 

        .. code-block:: bash

            admin@dc-2:~$ nano /tmp/new.ldif
            ---
            dn: cn=posix ids,cn=distributed numeric assignment plugin,cn=plugins,cn=config
            changetype: modify
            replace: dnaMaxValue
            dnaMaxValue: [значение]
            changetype: modify
            replace: dnaNextValue
            dnaNextValue: [значение]

    
    2.  ``ldapsearch`` и ``ipa-replica-manage``

    .. code-block:: bash

       admin@dc-1:~$ dnamaxvalue=[желаемый максимальный id]
       admin@dc-1:~$ let dnaminvalue=$dnamaxvalue-200000
       admin@dc-1:~$ sudo ipa-replica-manage dnanextrange-set $HOSTNAME ${dnaminvalue}-${dnamaxvalue} 

Если контроллер домена недоступен
---------------------------------------------------

Если контроллер домена вышел из строя внезапно, и не осталось копии, необходимо:

1. Если служба: 

.. code-block:: bash

   aldpro-roles-management

была запущена на вышедшем из строя контроллере домена, необходимо запустить ее на любом доступном контроллере, необязательно первом. Важно, чтобы она была запущена только на одном контроллере домена.

Чтобы включить службу:

.. code-block:: bash
    
    systemctl start aldpro-roles-management

Чтобы отключить службу:

.. code-block:: bash
    
    systemctl stop aldpro-roles-management

Начиная с версии 2.5.0 **ALD Pro** службы ``aldpro-roles-sweeper, aldpro-process-pending-roles, aldpro-check-in-restore`` объединены в одну службу ``aldpro-roles-management``, сохранившую функционал трех предыдущих. Данная служба имеет созможность форсированной отладки путем изменения интервалов запуска тех или иных функций службы.

Атрибуты службы:

``-r`` - период, в который будет запускаться рендер ролей ожидающих активацию (``default: 1m``). Значение ``0`` отключит данную функцию;

``-f`` - период, в который будет запускаться проверка/исправление целостности ролей после репликации (``default: 1h``). Значение ``0`` отключит данную функцию;

``-u`` - период, в который будет запускаться сборщик мусора (``default: 24h``). Значение ``0`` отключит данную функцию. Формат: целое положительное число [s-секунды | m-минуты | h-часы ] либо 0;

``-ust`` - примерное время, в которое должен будет запускаться сборщик мусора минимальное значение среди остальных флагов (``default: 00:00``). Формат: часы:минуты.

Период рендера ролей должен быть самым маленьким иначе демон не запустится

Пример передачи аргументов в демона и возврата дефолтных значений:

.. code-block:: bash

    systemctl stop aldpro-roles-management
    systemctl set-environment ROLES_DAEMON_ARGS="-r 10s -f 15s"
    systemctl start aldpro-roles-management

Пример возврата работы демона на значениях по умолчанию:

.. code-block:: bash

    systemctl stop aldpro-roles-management
    systemctl unset-environment ROLES_DAEMON_ARGS
    systemctl start aldpro-roles-management

2. Удалить первый контроллер домена из всех серверов мониторинга:

    1. произвести авторизацию на сервере мониторинга;

    2. слева нажать **Configuration - Hosts**;

    3. отметить галкой нужный сервер и нажать кнопку **Delete**.

3. Проверить, что на КД, который заменит первый имеется файл ``/etc/ssl/freeipa/ca.key``.

4. Адреса контроллеров в файле ``/etc/resolv.conf``

   1. На каждом компьютере в домене в файле ``/etc/resolv.conf`` необходимо изменить адрес удаляемого сервера на адрес любого другого. Пример: Если адрес первого контроллера домена ``10.2.0.10``, а адрес второго контроллера домена ``10.2.0.11``, то содержимое файла должно быть следующим:

   .. code-block:: bash

        domain <имя домена>
        nameserver 10.2.0.11
        
   2. Данное действие можно выполнить при помощи задания автоматизации или групповой политикой. Пример кода:

    .. code-block:: bash
        
        replace_string:
          file.replace:
              - name: /etc/resolv.conf
              - pattern: 10.2.0.10
              - repl: 10.2.0.11

5. Адреса контроллеров в файле ``/etc/sssd/sssd.conf``

На каждом компьютере в домене в файле ``/etc/sssd/sssd.conf`` необходимо изменить адрес удаляемого сервера на адрес любого другого. Пример:

    .. code-block:: bash

        [domain/ald.company.lan]
        ...
        ipa_server = _srv_,<fqdn.НОВОГО.КД>
        ...

Важно помнить, что на контроллерах домена параметр будет содержать собственный адрес, его менять не следует.

6. На всех клиентах (в т.ч. части серверной группировки), которые вводились в домен через удаляемый контроллер внести изменения в файл ``/etc/ldap/ldap.conf``:

.. code-block:: bash

    ...
    URI ldaps://<fqdn.НОВОГО.КД>
    ...

7. На всех клиентах (в т.ч. части серверной группировки), которые вводились в домен через удаляемый контроллер внести изменения в файл ``/etc/ipa/default.conf``(см. **Конфигурационный файл FreeIPA /etc/ipa/default.conf**): 

.. code-block:: bash

    [global]
    ...
    server = <fqdn.НОВОГО.КД>
    ...
    xmlrpc_uri = https://<fqdn.НОВОГО.КД>/ipa/xml
    ...

8. Перезапустить службы sssd после изменения параметров:

.. code-block:: bash

    sudo systemctl restart sssd

9. Внести изменения в параметры **DNS** зон (**Роли и службы сайта > Служба разрешения имён**):

    1. выбрать прямую зону, открыть ее записи, перейти в **Параметры зоны**, изменить **Полномочный сервер имён** на fqdn нового "первого" контроллера;

    2. выбрать обратную зону, открыть ее записи, перейти в **Параметры зоны**, изменить **Полномочный сервер имён** на fqdn нового "первого" контроллера.

10. Если есть только 1 корневой ``NTP-сервер`` (**Роли и службы сайта > Служба синхронизации времени > Корневые NTP-серверы домена**) добавить новый, выбрав новый "первый" КД из доступных. Удалить тот, который ссылается на контроллер, который будет удален. После действий проверить изменения в **LDAP**:

.. code-block:: bash

    suffix=$(ldapsearch -Q -LLL -s base|grep dn:|cut -d ' ' -f2)
    ldapsearch -Q -LLL -b cn=ntp,cn=services,cn=aldpro,cn=etc,$suffix -o ldif-wrap=no

Важно помнить, что если много внешних ``ntp-серверов`` в конец запроса можно добавить ``isexternal=FALSE``, тогда не будут показаны внешние сервера.

11. Убедиться, что между удаляемым контроллером домена и другим контроллером домена установлены двусторонние соглашения о репликации. Сделать это можно двумя способами:

    1. На портале управления в разделе **Управление доменом - Сайты и службы - Соглашения о репликации** должны быть двусторонние стрелки между контроллерами домена.

    2. В консоли любого контроллера домена командой (вместо ``dc=aldpro,dc=test`` необходимо подставить имя своего домена):

    .. code-block:: bash

        suffix=$(ldapsearch -Q -LLL -s base|grep dn:|cut -d ' ' -f2)
        ldapsearch -D -Q -LLL "cn=directory manager" -W -b "cn=topology,cn=ipa,cn=etc,$suffix"
        unset suffix

    В выводе команды должно быть ``ipaReplTopoSegmentDirection: both`` для всех контроллеров домена.

    3. Если это не так, необходимо восстановить репликации. В противном случае, удаление контроллера домена будет невозможно.

12. Проверить репликацию между удаляемым КД и новым "первым" КД. Проверить не идет ли в данный момент синхронизация:

.. code-block:: bash

    suffix=$(ldapsearch -Q -LLL -s base|grep dn:|cut -d ' ' -f2)
    ds-replcheck online -D "cn=Directory Manager" -m ldap://<fqdn.старого.кд>:389 -r ldap://<fqdn.новоого.кд>:389 -b $suffix
    dsconf -j ALD-COMPANY-LAN replication status --suffix $domain_name|grep update-in-progres -A1
    unset suffix

В случае отсутствия команды ``dsconf`` следует установить ее следующей командой:

.. code-block:: bash

    sudo apt-get install python3-lib389

Важно помнить, что не должны совпадать ``krbloginfailedcount``. Если идет репликация - дождаться окончания.

13. На новом первом КД внести изменения: значения атрибута ``rbtaSubsystemConfig`` должны соответствовать ``"is_master": true, "setup_pkiproxy": true``:

.. code-block:: bash

    suffix=$(ldapsearch -Q -LLL -s base|grep dn:|cut -d ' ' -f2)
    ldapsearch -Q -LLL -b cn=computers,cn=accounts,$suffix fqdn=*$HOSTNAME* dn rbtaSubsystemConfig -o ldif-wrap=no > new-config.ldif
    nano new-config.ldif
    ---
    dn: fqdn=dc-2.ald.company.test,cn=computers,cn=accounts,dc=ald,dc=company,dc=test
    changetype: modify
    replace: rbtaSubsystemConfig
    rbtaSubsystemConfig: {"config_state": "applied", "is_master": true, "setup_gc": true, "setup_pkiproxy": true, "setup_syncer": true, "config_state_local": "applied"}
    ---
    ldapmodify -f new-config.ldif

Удаление контроллера домена
---------------------------

1. От имени ``root'а`` на НОВОМ первом КД выполнить команду:

   .. code-block:: bash

      ipa-replica-manage del <fqdn.старого.кд>

2. Авторизоваться на портале управления по адресу ``https://<fqdn.НОВОГО.КД>``

3. Проверить успешность удаления можно на портале управления в разделе **Управление доменом - Сайты и службы - Контроллеры домена**. Удаленного контроллера домена не должно быть в списке.

4. Зайти в раздел **Роли и службы сайта - Служба разрешения имён**.

5. В списке **Имя зоны** кликнуть на имя вашего домена.

6. В строке поиска набрать имя удаленного контроллера домена.

7. Галочкой выделить все появившиеся записи и нажать кнопку **Удалить**.

8. Пункты 6-7 повторить до полного удаления всех записей, относящихся к удаленному контроллеру домена.

9. Запустить процедуру обновления первого КД. Важно помнить, что у модуля синхронизации локальная база данных, нужно выполнить перенос базы:

.. code-block:: bash

   aldpro-server-install -d $(hostname -d) -n $(hostname -s) --ip $(hostname -i) --setup_syncer --setup_gc --no-reboot --update

После ввода команды система запросит ввести пароль администратора домена.

.. attention::
    
   Если после удаления контроллера домена подсистемы невозможно развернуть, необходимо проверить содержимое файла ``/etc/resolv.conf`` на компьютере, на котором будет развернута подсистема - в файле не должно быть адреса удалённого КД